package com.zishuimuyu.trans;

import java.util.HashMap;
import java.util.Map;

/**
 * 抽象的在线翻译器类，实现了 Translator 接口。
 * 该类提供了翻译的基本框架，具体的请求和解析逻辑由子类实现。
 */
public abstract class AbstractOnlineTranslator implements Translator {
    /**
     * 语言映射，用于将内部语言枚举 LANG 映射到具体翻译服务所支持的语言代码。
     * 此映射由子类完成初始化。
     */
    protected Map<LANG, String> langMap = new HashMap<>();

    /**
     * 实现 Translator 接口的 trans 方法，用于执行翻译操作。
     * 该方法是最终方法，不允许子类重写。
     *
     * @param from  源语言，使用 LANG 枚举表示
     * @param targ  目标语言，使用 LANG 枚举表示
     * @param query 需要翻译的文本
     * @return 翻译结果字符串，如果发生异常则返回空响应字符串
     * @throws Exception 如果在翻译过程中发生异常
     */
    @Override
    final public String trans(LANG from, LANG targ, String query) throws Exception {
        // 初始化响应字符串为空
        String response = "";
        try {
            // 调用抽象方法 getResponse 向翻译服务发送请求并获取响应
            response = getResponse(from, targ, query);
            // 调用抽象方法 parseString 解析响应字符串得到翻译结果
            String result = parseString(response);
            return result;
        } catch (Exception e) {
            // 如果发生异常，返回空响应字符串
            return response;
        }
    }

    /**
     * 抽象方法，用于向翻译服务发送请求并获取响应。
     * 具体的请求逻辑由子类实现。
     *
     * @param from  源语言，使用 LANG 枚举表示
     * @param targ  目标语言，使用 LANG 枚举表示
     * @param query 需要翻译的文本
     * @return 翻译服务返回的响应字符串
     * @throws Exception 如果在发送请求过程中发生异常
     */
    abstract protected String getResponse(LANG from, LANG targ, String query) throws Exception;

    /**
     * 抽象方法，用于解析翻译服务返回的 JSON 响应字符串。
     * 具体的解析逻辑由子类实现。
     *
     * @param jsonString 翻译服务返回的 JSON 响应字符串
     * @return 解析后的翻译结果字符串
     */
    abstract protected String parseString(String jsonString);
}

